from pydantic import BaseModel


######################################################### Pydantic 模型中的字段定义

# 在 Pydantic 模型中，字段（如 pydantic_object）看起来像是类属性，但实际上它们是用于描述模型结构的元数据。这些字段最终会成为实例属性。
# 在 Pydantic 模型中，字段（如 pydantic_object）看起来像是类属性，但实际上它们是用于描述模型结构的元数据。这些字段最终会成为实例属性。
#
# 为什么？
# Pydantic 使用了 Python 的描述符协议（Descriptor Protocol）和元类（Metaclass）来实现这种行为。具体来说：
#
# 字段定义时的行为：
# 当你在 Pydantic 模型中定义字段（如 pydantic_object），它实际上是一个特殊的对象（例如 Field 或类似的描述符）。
# 这些对象存储了字段的类型信息、默认值、验证规则等元数据。
# 实例化时的行为：
# 在实例化 Pydantic 模型时，元类会动态地将这些字段转换为实例属性。
# 传入的关键字参数（如 pydantic_object=People）会被解析并赋值给实例的对应属性。

class User(BaseModel):
    # 虽然name和age看起来是类属性，但是实际上他只是字段定义，在实例化的时候会被转换为实例属性。
    name: str
    age: int


u1 = User(name='yinsc', age=23)
u2 = User(name='zhumq', age=18)

print(f'u1的名称是：{u1.name},u1的年纪是：{u1.age}')
print(f'u2的名称是：{u2.name},u1的年纪是：{u2.age}')
